﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Lavanderia.Entities;
using System.Data;

namespace Lavanderia.Repository
{
    public class UsuarioRepository:MasterRepository,IUsuarioRepository
    {
        public List<USUARIO> GetALLFromUsuario()
        {
            var query = from c in context.USUARIOs.Include("TRABAJADOR").Include("ROL").Include("USUARIO_MENU.MENU")
                        select c;
            return query.ToList();
        }

        public List<USUARIO> GetAllFromUsuarioByPersona(string criterio)
        {
            var query = from e in context.USUARIOs.Include("TRABAJADOR").Include("ROL")
                        select e;
            if (criterio != null && criterio != string.Empty && criterio != "")
            {
                query = from e in context.USUARIOs.Include("TRABAJADOR").Include("ROL")
                        where e.TRABAJADOR.ApMaterno.ToUpper().Contains(criterio)||
                                e.TRABAJADOR.ApPaterno.ToUpper().Contains(criterio) ||
                                e.TRABAJADOR.Nombres.ToUpper().Contains(criterio) ||
                                e.TRABAJADOR.Dni.ToUpper().Contains(criterio)
                        select e;
            }
            return query.ToList();
        }

        public USUARIO GetAllFromUsuarioByPersonaId(string dni)
        {
            var query = from c in context.USUARIOs.Include("TRABAJADOR").Include("ROL")
                        where c.TRABAJADOR.Dni == dni
                        select c;
            return query.SingleOrDefault();
        }

        public bool ExistDuplicidadUsuario(string dni, int id)
        {
            var query = from c in context.USUARIOs
                        where c.TRABAJADOR.Dni.CompareTo(dni) == 0 && c.Id != id
                        select c;
            return query.Any();
        }

        public bool ExisteUsuario(string dni, string password)
        {
            var query = from c in context.USUARIOs
                        where c.TRABAJADOR.Dni.CompareTo(dni) == 0 &&
                              c.Password.ToUpper().CompareTo(password.ToUpper()) == 0
                        select c;
            return query.Any();
        }

        public bool ExisteUsuarioRol(int personaId)
        {
            var query = from c in context.USUARIOs
                        where c.IdTrabajador == personaId
                        select c;
            return query.Any();
        }

        public bool PasswdCorrecta(string password)
        {
            var query = from c in context.USUARIOs
                        where c.Password.ToUpper().CompareTo(password.ToUpper()) == 0
                        select c;
            return query.Any();
        }

        public void AddUsuario(USUARIO usuario)
        {
            foreach (var item in usuario.USUARIO_MENU)
            {
                context.Entry(item.MENU).State = EntityState.Unchanged;
                context.Entry(item).State = EntityState.Added;
            }

            usuario.TRABAJADOR = null;

            context.USUARIOs.Add(usuario);
            context.SaveChanges();
        }

        public void UpdateUsuario(USUARIO usuario)
        {
            //obtenemos datos de la DB
            var usuarioDB = context.USUARIOs.Find(usuario.IdTrabajador);
            var usuMenuDB = (from c in context.USUARIO_MENU.Include("MENU")
                             where c.IdUsuario.Equals(usuario.IdTrabajador)
                             select c).ToList();
            List<USUARIO_MENU> listaElemntsEliminadosDB = new List<USUARIO_MENU>();

            //igualamos los cambios echos y actualizamos los de la DB
            usuarioDB.Password = usuario.Password;
            usuarioDB.IdTrabajador = usuario.IdTrabajador;
            usuarioDB.IdRol = usuario.IdRol;

            //verificamos menus q tengan en comun SI NO agregamos
            foreach (var item in usuario.USUARIO_MENU)
            {
                var existe = usuarioDB.USUARIO_MENU.Where(p => p.IdMenu.Equals(item.IdMenu)).SingleOrDefault();
                if (existe == null)
                {
                    item.USUARIO = null;
                    item.MENU = null;
                    context.Entry(item).State = EntityState.Unchanged;
                    context.USUARIO_MENU.Add(item);
                }
            }

            //verificamos los equipos q esten en la DB POR DEMAS
            foreach (var item in usuarioDB.USUARIO_MENU)
            {
                var existe = usuario.USUARIO_MENU.Where(p => p.IdMenu.Equals(item.IdMenu)).SingleOrDefault();
                if (existe == null)
                {
                    listaElemntsEliminadosDB.Add(item);
                }
            }

            //eliminamos los equipos que estan POR DEMAS n la DB
            foreach (var item in listaElemntsEliminadosDB)
            {
                context.USUARIO_MENU.Remove(item);
            }

            context.Entry(usuarioDB).State = EntityState.Modified;
            context.SaveChanges();

        }

        public void DeleteUsuario(int id)
        {
            var existe = context.USUARIOs.Where(p => p.Id.Equals(id)).SingleOrDefault();

            if (existe != null)
            {
                context.USUARIOs.Remove(existe);
                context.SaveChanges();
            }
        }

        public void UpdatePasswdUsuario(USUARIO usuario)
        {
            usuario.TRABAJADOR = null;
            usuario.USUARIO_MENU = null;

            context.Entry(usuario).State = EntityState.Modified;
            context.SaveChanges();
        }
    }
}
